//+------------------------------------------------------------------+
//| 封装的 TEMA 计算和处理函数                                       |
//+------------------------------------------------------------------+

// 定义黄金的交易品种代码
#define SYMBOL "GOLD"
// 定义要处理的 K 线数量
#define KLINE_COUNT 9000 //30000根K线要注意，周期大了的话历史k线可能没那么多，会报错
// 定义中国时区与 UTC 的偏移量（小时）
#define CHINA_TIME_OFFSET 8
// 定义 TEMA 指标的周期
#define TEMA_PERIOD 400

//多少个比较
#define GESU 20

// 全局变量，用于存储 TEMA 句柄
int hTEMA;

// 声明外部变量
extern int Trend5;
extern int Trend15;
extern int Trend30;
extern int Trend1H;
extern int Trend4H;

// 将时间转换为中国时间
datetime ConvertToChinaTime(datetime originalTime) {
    return originalTime + CHINA_TIME_OFFSET * 3600;
}

// 新增函数，将时间周期枚举值转换为字符串
string PeriodToString(ENUM_TIMEFRAMES period) {
    switch (period) {
        case PERIOD_M1: return "M1";
        case PERIOD_M2: return "M2";
        case PERIOD_M3: return "M3";
        case PERIOD_M4: return "M4";
        case PERIOD_M5: return "M5";
        case PERIOD_M6: return "M6";
        case PERIOD_M10: return "M10";
        case PERIOD_M12: return "M12";
        case PERIOD_M15: return "M15";
        case PERIOD_M20: return "M20";
        case PERIOD_M30: return "M30";
        case PERIOD_H1: return "H1";
        case PERIOD_H2: return "H2";
        case PERIOD_H3: return "H3";
        case PERIOD_H4: return "H4";
        case PERIOD_H6: return "H6";
        case PERIOD_H8: return "H8";
        case PERIOD_H12: return "H12";
        case PERIOD_D1: return "D1";
        case PERIOD_W1: return "W1";
        case PERIOD_MN1: return "MN1";
        default: return "Unknown";
    }
}

// 新增函数，在图中绘制 TEMA 线
void DrawTEMAOnChart(datetime &klineTimes[], double &temaValues[], int count, color lineColor, string periodStr) {
    for (int i = 0; i < count - 1; i++) {
        string objectName = periodStr + "_TEMALine_" + IntegerToString(i);
        ObjectCreate(0, objectName, OBJ_TREND, 0, klineTimes[i], temaValues[i], klineTimes[i + 1], temaValues[i + 1]);
        ObjectSetInteger(0, objectName, OBJPROP_COLOR, lineColor); // 设置线段颜色
        ObjectSetInteger(0, objectName, OBJPROP_WIDTH, 2); // 设置线段宽度为 2
        ObjectSetInteger(0, objectName, OBJPROP_STYLE, STYLE_SOLID); // 设置线段样式为实线
    }
}

// 处理指定周期的 TEMA 函数
bool ProcessTEMAForPeriod(ENUM_TIMEFRAMES timeframe, int &trendFlag, color lineColor) {
    // 初始化 TEMA 指标
    hTEMA = iTEMA(SYMBOL, timeframe, TEMA_PERIOD, PRICE_CLOSE, 0);
    if (hTEMA == INVALID_HANDLE) {
        Print("无法初始化 TEMA 指标，周期: ", PeriodToString(timeframe), "，错误代码: ", GetLastError());
        return false;
    }

    // 动态分配数组
    double temaValues[];
    datetime klineTimes[];

    // 调整数组大小
    if (!ArrayResize(temaValues, KLINE_COUNT)) {
        Print("无法调整 temaValues 数组大小，周期: ", PeriodToString(timeframe));
        IndicatorRelease(hTEMA);
        return false;
    }
    if (!ArrayResize(klineTimes, KLINE_COUNT)) {
        Print("无法调整 klineTimes 数组大小，周期: ", PeriodToString(timeframe));
        IndicatorRelease(hTEMA);
        return false;
    }

    if (CopyBuffer(hTEMA, 0, 0, KLINE_COUNT, temaValues) < 0) {
        Print("无法从 TEMA 指标缓冲区复制数据，周期: ", PeriodToString(timeframe), "，错误代码: ", GetLastError());
        IndicatorRelease(hTEMA);
        return false;
    }
    if (CopyTime(SYMBOL, timeframe, 0, KLINE_COUNT, klineTimes) < 0) {
        Print("无法从 K 线获取时间数据，周期: ", PeriodToString(timeframe), "，错误代码: ", GetLastError());
        IndicatorRelease(hTEMA);
        return false;
    }

    // 循环遍历前 KLINE_COUNT 根 K 线
    for(int i = 0; i < KLINE_COUNT; i++) {
        // 获取指定 K 线的开盘时间
        datetime openTime = klineTimes[i];
        if(openTime != 0) {
            // 将开盘时间转换为字符串（欧美时间）
            string timeStr = TimeToString(openTime, TIME_DATE | TIME_SECONDS);
            // 计算中国时间
            datetime chinaOpenTime = ConvertToChinaTime(openTime);
            // 将中国时间转换为字符串
            string chinaTimeStr = TimeToString(chinaOpenTime, TIME_DATE | TIME_SECONDS);

            // 添加条件判断，只打印倒数 GESU 根 K 线的信息
            if (i >= KLINE_COUNT - GESU) {
                // 打印欧美时间、中国时间和 TEMA 数值
                Print("第 ", i + 1, " 根 K 线（周期: ", PeriodToString(timeframe), "）的开盘时间: 欧美时间 - ", timeStr, ", 中国时间 - ", chinaTimeStr, ", TEMA 数值: ", temaValues[i]);
            }
        }
    }
    
    // 打印第一根和第 10 根 TEMA 数值
    if (KLINE_COUNT >= GESU) 
    {
        Print("倒数第",GESU,"根","TEMA 数值: ", temaValues[KLINE_COUNT-GESU]);
        Print("最后一根 TEMA 数值: ", temaValues[KLINE_COUNT-1]);
    } else 
    {
        Print("KLINE_COUNT 小于 10，无法打印第 10 根 TEMA 数值。");
    }
    
    //开单条件
    if(temaValues[KLINE_COUNT-1] > temaValues[KLINE_COUNT-GESU])
    {
        trendFlag = 1;
    }
    if(temaValues[KLINE_COUNT-1] < temaValues[KLINE_COUNT-GESU])
    {
        trendFlag = 0;
    }

    // 调用绘制 TEMA 线的函数
    string periodStr = PeriodToString(timeframe);
    DrawTEMAOnChart(klineTimes, temaValues, KLINE_COUNT, lineColor, periodStr);

    return true;
}

// 封装的 TEMA 处理函数
bool ProcessTEMA() {
    // 处理 5 分钟周期
    if (!ProcessTEMAForPeriod(PERIOD_M5, Trend5, clrGreen)) {
        return false;
    }

    // 处理 15 分钟周期
    if (!ProcessTEMAForPeriod(PERIOD_M15, Trend15, clrPurple)) {
        return false;
    }

    // 处理 30 分钟周期
    if (!ProcessTEMAForPeriod(PERIOD_M30, Trend30, clrBlue)) {
        return false;
    }

    // 处理 1 小时周期
    if (!ProcessTEMAForPeriod(PERIOD_H1, Trend1H, clrBlack)) {
        return false;
    }

    // 处理 4 小时周期
    if (!ProcessTEMAForPeriod(PERIOD_H4, Trend4H, clrRed)) {
        return false;
    }

    return true;
}